In [1]:
#Libs
import pandas as pd
import pandas_profiling

#Seleção de features
from sklearn.decomposition import PCA
In [2]:
#Carregando dataset
df = pd.read_csv('../input/train.csv')
In [3]:
#Formato do DataFrame
df.shape
Out[3]:
(76020, 371)
In [4]:
#Colunas com valores NA
print([x for x in df.isnull().sum() > 0 if x])
[]
In [5]:
#Observando o nome de algumas variáveis
df.columns[:20]
Out[5]:
Index(['ID', 'var3', 'var15', 'imp_ent_var16_ult1', 'imp_op_var39_comer_ult1',
       'imp_op_var39_comer_ult3', 'imp_op_var40_comer_ult1',
       'imp_op_var40_comer_ult3', 'imp_op_var40_efect_ult1',
       'imp_op_var40_efect_ult3', 'imp_op_var40_ult1',
       'imp_op_var41_comer_ult1', 'imp_op_var41_comer_ult3',
       'imp_op_var41_efect_ult1', 'imp_op_var41_efect_ult3',
       'imp_op_var41_ult1', 'imp_op_var39_efect_ult1',
       'imp_op_var39_efect_ult3', 'imp_op_var39_ult1', 'imp_sal_var16_ult1'],
      dtype='object')
In [6]:
#Agrupamos as variáveis pela primeira palavra antes da ocorrência do caracter _
colgroups = list(set([x.split('_')[0] for x in df.columns]))
sorted(colgroups)
Out[6]:
['ID',
 'TARGET',
 'delta',
 'imp',
 'ind',
 'num',
 'saldo',
 'var15',
 'var21',
 'var3',
 'var36',
 'var38']
In [7]:
#Carregando dataframes por tipo
df_delta = df.filter(regex='^delta')
df_imp = df.filter(regex='^imp')
df_ind = df.filter(regex='^ind')
df_num = df.filter(regex='^num')
df_saldo = df.filter(regex='^saldo')
df_var = df.filter(regex='^var')
In [8]:
df_delta.profile_report()
/home/gustavo/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py:4025: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  return super(DataFrame, self).rename(**kwargs)
Out[8]:

Nenhuma destas variáveis serão selecionadas

In [9]:
df_imp.profile_report()
Out[9]:

Variáveis numéricas contínuas selecionadas:

  • imp_aport_var13_hace3
  • imp_ent_var16_ult1
  • imp_op_var39_comer_ult1
  • imp_op_var39_comer_ult3
  • imp_op_var39_efect_ult1
  • imp_op_var39_efect_ult3
  • imp_op_var39_ult1
  • imp_trans_var37_ult1
In [10]:
df_ind.profile_report()
Out[10]:

Variáveis booleanas selecionadas:

  • ind_var30
  • ind_var39_0
  • ind_var43_emit_ult1
  • ind_var43_recib_ult1
  • ind_var5
  • ind_var5_0
In [11]:
df_num.profile_report()
Out[11]:

Variáveis numéricas contínuas selecionadas:

  • num_med_var22_ult3
  • num_med_var45_ult3
  • num_op_var39_comer_ult1
  • num_op_var39_efect_ult1
  • num_var22_hace2
  • num_var22_hace3
  • num_var22_ult1
  • num_var30
  • num_var30_0
  • num_var35
  • num_var39_0
  • num_var42
  • num_var45_hace3
  • num_var45_ult1
  • num_var5_0

Variáveis numéricas categóricas selecionadas:

  • num_meses_var12_ult3
  • num_meses_var13_corto_ult3
  • num_meses_var39_vig_ult3
  • num_meses_var5_ult3
  • num_meses_var8_ult3
In [12]:
df_saldo.profile_report()
Out[12]:

Variáveis numéricas contínuas selecionadas:

  • saldo_medio_var5_hace2
  • saldo_medio_var5_hace3
  • saldo_medio_var5_ult1
  • saldo_medio_var5_ult3
  • saldo_var30
  • saldo_var5
In [13]:
df_var.profile_report()
Out[13]:

Variáveis numéricas contínuas selecionadas:

  • var15
  • var36

Ainda restaram muitas variáveis numéricas. Vamos utilizar PCA para selecionar as mais significativas.

In [14]:
#Variáveis numéricas
num_vars = ['imp_aport_var13_hace3', 'imp_ent_var16_ult1', 'imp_op_var39_comer_ult1',
            'imp_op_var39_comer_ult3', 'imp_op_var39_efect_ult1', 'imp_op_var39_efect_ult3',
            'imp_op_var39_ult1', 'imp_trans_var37_ult1', 'num_med_var22_ult3', 'num_med_var45_ult3',
            'num_op_var39_comer_ult1', 'num_op_var39_efect_ult1', 'num_var22_hace2', 'num_var22_hace3',
            'num_var22_ult1', 'num_var30', 'num_var30_0', 'num_var35', 'num_var39_0', 'num_var42',
            'num_var45_hace3', 'num_var45_ult1', 'num_var5_0', 'saldo_medio_var5_hace2',
            'saldo_medio_var5_hace3', 'saldo_medio_var5_ult1', 'saldo_medio_var5_ult3',
            'saldo_var30', 'saldo_var5', 'var15', 'var36']

# Aplicando PCA para extrair os componentes que justificam pelo menos 90% da variância nos dados
dim_reduce = PCA(n_components = 0.90)
dim_reduce.fit_transform(df[num_vars])

# Variância total dos componentes
print(dim_reduce.explained_variance_ratio_)
[0.7319589  0.11270656 0.07909668]
In [15]:
# DataFrame após PCA
pd.DataFrame(dim_reduce.components_, columns = num_vars).T
Out[15]:
0 1 2
imp_aport_var13_hace3 1.785460e-01 -6.259029e-01 7.342395e-01
imp_ent_var16_ult1 9.486609e-04 9.767555e-04 -9.439769e-04
imp_op_var39_comer_ult1 -2.604658e-05 3.486185e-04 1.016197e-04
imp_op_var39_comer_ult3 -7.029472e-05 4.110316e-04 1.127404e-04
imp_op_var39_efect_ult1 -1.937325e-05 5.075729e-04 9.588101e-05
imp_op_var39_efect_ult3 -2.302917e-05 5.605509e-04 2.000397e-04
imp_op_var39_ult1 -3.538173e-05 8.945303e-04 2.121662e-04
imp_trans_var37_ult1 1.407053e-01 7.681708e-01 6.211734e-01
num_med_var22_ult3 6.686190e-06 3.105769e-06 -4.979366e-07
num_med_var45_ult3 2.234740e-05 1.345488e-05 4.069240e-06
num_op_var39_comer_ult1 -3.068400e-06 7.786521e-06 1.574926e-06
num_op_var39_efect_ult1 -1.156366e-06 2.326883e-06 4.398030e-08
num_var22_hace2 9.747136e-06 1.138753e-05 -1.327262e-05
num_var22_hace3 1.314384e-05 -1.123329e-05 7.037928e-06
num_var22_ult1 2.107102e-06 9.692561e-06 5.098222e-06
num_var30 8.376523e-06 -1.947366e-06 1.629133e-06
num_var30_0 1.118155e-05 -5.119442e-06 3.739628e-06
num_var35 7.798612e-06 5.211926e-07 1.224710e-06
num_var39_0 1.262895e-06 8.011766e-07 -5.256947e-07
num_var42 3.254091e-06 5.097805e-06 -4.061115e-06
num_var45_hace3 2.839641e-05 -2.912956e-05 2.293276e-05
num_var45_ult1 1.510915e-05 4.476074e-05 1.978273e-05
num_var5_0 -8.068909e-08 2.529713e-07 -5.735948e-07
saldo_medio_var5_hace2 7.378405e-02 6.075161e-02 -1.553289e-01
saldo_medio_var5_hace3 5.852360e-02 -6.801029e-02 1.293548e-02
saldo_medio_var5_ult1 3.435220e-02 7.313348e-02 -4.368837e-02
saldo_medio_var5_ult3 4.458459e-02 4.328371e-02 -4.898363e-02
saldo_var30 9.672785e-01 -2.676647e-03 -2.096983e-01
saldo_var5 2.564796e-02 5.109931e-02 -4.958898e-02
var15 6.560264e-05 -1.335707e-05 1.515687e-06
var36 -1.293712e-04 3.004870e-06 -4.435044e-06

90% da variância das variáveis numéricas pôde ser explicadar por 3 componentes principais. Serão selecionadas as três variáveis com maior variância entre estes componentes:

  • imp_aport_var13_hace3
  • imp_trans_var37_ult1
  • saldo_var30